
const { app, BrowserWindow, Tray, nativeImage, Menu, ipcMain } = require('electron');
const path = require('path');
const os = require('os');

let mainWindow, tray;

function createWindow() {
    // 创建系统托盘（注意：确保同级目录有electron_white.png图片）
    const trayIcon = nativeImage.createFromPath(path.join(__dirname, 'electron_white.png'));
    tray = new Tray(trayIcon);

    // 创建托盘右键菜单
    const trayMenu = Menu.buildFromTemplate([
        { 
            label: '显示窗口', 
            click: () => {
                mainWindow.show(); // 显示窗口
                mainWindow.focus(); // 聚焦窗口
            } 
        },
        { type: 'separator' }, // 分隔线
        { 
            label: '退出应用', 
            click: () => {
                // 退出前清理托盘和窗口
                tray.destroy();
                mainWindow.destroy();
                app.quit();
            } 
        }
    ]);
    tray.setContextMenu(trayMenu); // 绑定菜单到托盘


    // 创建主窗口
    mainWindow = new BrowserWindow({
        width: 800,
        height: 600,
        title: 'electron桌面版', // 窗口标题
        // 可选：添加窗口图标（替换为你的图标路径）
        // icon: path.join(__dirname, 'window_icon.png'),
        webPreferences: {
            nodeIntegration: false, // 禁用node集成（安全最佳实践）
            contextIsolation: true, // 启用上下文隔离（安全最佳实践）
            sandbox: false, // 明确关闭沙箱，确保预加载可使用 Node 内置模块
            // 指定预加载脚本：用于在渲染层安全地注入平台信息到页面
            preload: path.join(__dirname, 'preload.js')
        }
    });

    // 适配macOS窗口按钮
    mainWindow.setWindowButtonVisibility(true);

    // 加载本地页面显示平台信息
    mainWindow.loadFile(path.join(__dirname, 'index.html'));

    // 打开开发者工具便于观察预加载与页面日志
    mainWindow.webContents.openDevTools({ mode: 'detach' });


    // 窗口关闭时最小化到托盘（而非直接退出）
    mainWindow.on('close', (e) => {
        // 仅在用户主动退出时才真正关闭（避免托盘菜单"退出"被拦截）
        if (app.quitting) {
            mainWindow = null;
        } else {
            e.preventDefault(); // 阻止默认关闭行为
            mainWindow.hide(); // 隐藏窗口到托盘
        }
    });


    // 点击托盘图标切换窗口显示/隐藏
    tray.on('click', () => {
        if (mainWindow.isVisible()) {
            mainWindow.hide();
        } else {
            mainWindow.show();
            mainWindow.focus();
        }
    });


    // 可选：窗口隐藏时在托盘显示提示
    mainWindow.on('hide', () => {
        tray.displayBalloon({
            title: '应用已最小化',
            content: '点击托盘图标恢复窗口'
        });
    });
}

// 应用就绪后创建窗口
app.whenReady().then(createWindow);

// 处理不同平台的窗口关闭逻辑
app.on('window-all-closed', () => {
    // macOS：应用通常在所有窗口关闭后仍保持运行
    if (process.platform !== 'darwin') {
        app.quit();
    }
});

// macOS：点击dock图标时重新创建窗口
app.on('activate', () => {
    if (BrowserWindow.getAllWindows().length === 0) {
        createWindow();
    } else {
        mainWindow.show();
    }
});

// 标记应用是否正在退出（用于区分关闭窗口和退出应用）
app.on('before-quit', () => {
    app.quitting = true;
});

// 主进程：提供平台信息的兜底获取（预加载不可用 Node 内置模块时）
ipcMain.handle('get-platform-info', () => {
    const method1 = (() => {
        const platform = process.platform;
        const arch = process.arch;
        const map = { darwin: 'macOS', win32: 'Windows', linux: 'Linux', freebsd: 'FreeBSD', openbsd: 'OpenBSD', sunos: 'SunOS', aix: 'AIX' };
        const name = map[platform] || platform;
        return `${name} (${arch})`;
    })();
    const method2 = (() => {
        const platform = os.platform();
        const arch = os.arch();
        const release = os.release();
        const map = { darwin: 'macOS', win32: 'Windows', linux: 'Linux', freebsd: 'FreeBSD', openbsd: 'OpenBSD', sunos: 'SunOS', aix: 'AIX' };
        const name = map[platform] || platform;
        return `${name} ${release} (${arch})`;
    })();
    const method3 = (() => `${os.type()} ${os.release()} (${os.arch()}) @ ${os.hostname()}`)();
    const stats = (() => {
        const totalMem = os.totalmem();
        const freeMem = os.freemem();
        const usedMem = (totalMem && freeMem) ? (totalMem - freeMem) : 0;
        const cpus = os.cpus();
        const cpuCount = Array.isArray(cpus) ? cpus.length : 0;
        const cpuModel = Array.isArray(cpus) && cpus[0] ? cpus[0].model : 'Unknown';
        const loadavg = os.loadavg();
        // 仅在 *nix/macOS 做磁盘统计；Windows 留空
        let disk = { total: 0, used: 0, free: 0, percent: 'Unknown' };
        if (process.platform !== 'win32') {
            try {
                const { execSync } = require('child_process');
                const out = execSync('df -kP /').toString();
                const lines = out.trim().split('\n');
                const line = lines[lines.length - 1];
                const parts = line.trim().split(/\s+/);
                const totalKB = parseInt(parts[1], 10);
                const usedKB = parseInt(parts[2], 10);
                const availKB = parseInt(parts[3], 10);
                const capacity = parts[4];
                disk = {
                    total: Number.isFinite(totalKB) ? totalKB * 1024 : 0,
                    used: Number.isFinite(usedKB) ? usedKB * 1024 : 0,
                    free: Number.isFinite(availKB) ? availKB * 1024 : 0,
                    percent: capacity || 'Unknown'
                };
            } catch (e) {
                console.warn('[main] disk stats failed:', e);
            }
        }
        return { memory: { total: totalMem, free: freeMem, used: usedMem }, cpu: { count: cpuCount, model: cpuModel }, loadavg, disk };
    })();

    return {
        method1,
        method2,
        method3,
        method4: '',
        method5: '',
        raw: {
            processPlatform: process.platform,
            osPlatform: os.platform()
        },
        stats
    };
});